python-docx 无法提取Smarttag标签文字

  1. 1. 原因
  2. 2. 解决

原因

使用python-docx中的.text提取文本时总是少几个字,如图。

为什么捏?.png

转XML查看缺少部分的文字均为Smarttag标签。

太长不看
1
<w:p w14:paraId="5AF027F4" w14:textId="77777777" w:rsidR="00B8309C" w:rsidRPr="00393121" w:rsidRDefault="00B8309C" w:rsidP="00B8309C"><w:pPr><w:spacing w:line="240" w:lineRule="atLeast"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:b/><w:bCs/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr></w:pPr><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>N2-15</w:t></w:r><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>,十车,</w:t></w:r><w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="chmetcnv"><w:smartTagPr><w:attr w:name="TCSC" w:val="0"/><w:attr w:name="NumberType" w:val="1"/><w:attr w:name="Negative" w:val="False"/><w:attr w:name="HasSpace" w:val="False"/><w:attr w:name="SourceValue" w:val="143"/><w:attr w:name="UnitName" w:val="米"/></w:smartTagPr><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:b/><w:bCs/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>143</w:t></w:r><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t></w:t></w:r></w:smartTag><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>,五车,</w:t></w:r><w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="chmetcnv"><w:smartTagPr><w:attr w:name="TCSC" w:val="0"/><w:attr w:name="NumberType" w:val="1"/><w:attr w:name="Negative" w:val="False"/><w:attr w:name="HasSpace" w:val="False"/><w:attr w:name="SourceValue" w:val="83"/><w:attr w:name="UnitName" w:val="米"/></w:smartTagPr><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:b/><w:bCs/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>83</w:t></w:r><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t></w:t></w:r></w:smartTag><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>、三车,</w:t></w:r><w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="chmetcnv"><w:smartTagPr><w:attr w:name="TCSC" w:val="0"/><w:attr w:name="NumberType" w:val="1"/><w:attr w:name="Negative" w:val="False"/><w:attr w:name="HasSpace" w:val="False"/><w:attr w:name="SourceValue" w:val="44"/><w:attr w:name="UnitName" w:val="米"/></w:smartTagPr><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:b/><w:bCs/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t>44</w:t></w:r><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t></w:t></w:r></w:smartTag><w:r w:rsidRPr="00393121"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:b/><w:bCs/><w:sz w:val="21"/><w:szCs w:val="21"/></w:rPr><w:t></w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1999" w:type="dxa"/>

解决

1
2
3
def para2text(p):
rs = p._element.xpath('.//w:t')
return u" ".join([r.text for r in rs])

使用了段落对象的_element属性的xpath()方法来提取段落中的所有文本元素,然后将它们连接成一个字符串。

EP:

原方法:

1
tbs.cell(i, 2).text

新方法:

1
para2text(tbs.cell(i, 2))